﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Compilador de Pascal :: PLg 2007-2008 </title>

<link href="style.css" rel="stylesheet" type="text/css" />
<!--[if IE 6]>
  <style>
  /*<![CDATA[*/
#sidebarbottom {background:url(images/sidebarbottom.jpg) no-repeat -3px;}
  /*]]>*/
  </style>
<![endif]-->
</head>

<body>
<div id="wrap">
<div id="topbar">
  
</div>
<div id="header">
<ul id="topmenu">
<li><a href="index.html">Inicio</a></li>
<li><a href="Lexico.html">Léxico</a></li>
<li class="active"><a href="Sintactico.html">Sintáctico</a></li>
<li><a href="tablaDeSimbolos.html">Tabla de símbolos</a></li>
<li><a href="gestorDeErrores.html">Gestor de errores</a></li>
<li><a href="casosDePrueba.html">Casos de Prueba</a></li>
</ul>
</div>
<div id="content">
<div id="mainpage">
<a id="intro" name="intro"></a>
<h2>Introducción</h2>
Para realizar el analizador sintáctico, al igual que hicimos con su homólogo léxico, recurrimos a una herramienta de trabajo
que nos facilitara las cosas. Esta herramienta es Slk. Cabe destacar que Slk ha ayudado mucho en nuestro trabajo pero
nos gustaria dejar relevancia de la complejidad de adaptar las capas de léxico y el sintáctico como una de las grandes dificultades de
este proyecto.<br>
<br>
<a id="slk" name="slk"></a>
<h2>Hablemos de SLK</h2><br>
Slk es un generador de parsers para analizadores sintácticos.<br>
<br>

Tiene una gran variedad de alternativas. Analiza el tipo de gramática que recibe, 
deduciendo si es LL(1), LL(2) etc. Además una de las funciones que destacan sobre 
las demás es que te permite especificar el tipo de gramática que se quiere obtener. Esta opción ha resultado
especialmente útil en este proyecto dado que resultaba imposible obtener una gramatica LL(1) con la sentencia 
"IF THEN ELSE" incluida en el lenguaje.<br> 
Otra carácteristica a destacar de SLK es que permite obtener el parser en un conjunto variado de lenguajes de programación
(C, C++, C# y Java), lo cual es una ventaja más.<br>
<br>
 
<a id="func" name="func"></a>
<h2>Funcionamiento de SLK</h2><br>
<a id="func1" name="func1"></a>
<h3>Cómo generar la gramática</h3><br>
El SLK se ejecuta por linea de comandos y hay que proporcionarle la gramática con la sintáxis propia de SLK
(que explicaremos más adelante) y las configuraciones de ejecución necesarias. En nuestro caso, la configuración 
de ejecución seria la siguiente:
 <br><center><i>slk archivo_origen -j -i -k=2</i></center><br>
Se puede utilizar el archivo de proceso por lotes <i>generaParser.bat</i> para facilitar la tarea.
Con esto, conseguimos que el parser generado tenga código java y además permita generar una gramática LL(2),
lo que nos permite el reconocimiento de la sentencia IF-THEN-ELSE correctamente (evitando el conocido
problema del "dangling else").<br>
<br>

<a id="func2" name="func2"></a>
<h3>Qué obtenemos</h3><br>
El resultado de todo lo anterior es un conjunto de clases que tendremos que manipular a nuestro gusto.
Aquí se detallan instrucciones para <u>aplicar correctamente la nueva gramática.</u>
<br><br><br>
<b>- SlkAction.java</b>
<br>
Esta clase servirá para introducir las acciones sintácticas que realizará el analizador semántico.<br><br>
<i>Este archivo debe copiarse en el paquete Sintactico.</i>
<br><br><br>
<b>- SlkConstants.java</b>
<br>
En esta clase, se generan, como constantes estáticas, todos los símbolos terminales y no terminales de la gramática.
Están además acompañados de un identificador numérico exclusivo.<br><br>
<i>Este archivo debe copiarse en el paquete Sintactico.</i>
<br><br><br>
<b>- SlkError.java</b>
<br>
En esta clase se generan tres errores:<br>
- NO_ENTRY y MISMATCH son errores a la hora de reducir las reglas de la gramática con tokens recibidos.<br>
- INPUT_LEFT es un error que se ejecuta si se llega al final del fichero y aun quedan elementos en la pila.<br><br>
<i>Este archivo debe copiarse en el paquete Sintactico.</i>
<br><br><br>
<b>- SlkKeywords.txt</b>
<br>
En esta clase se encuentran todas las palabras clave del lenguaje para que sean localizadas en la gramatica por el parser.<br><br>
<i>Este archivo debe copiarse con la extensión .java en el paquete Sintactico.</i>
<br><br><br>
<b>- SlkLog.java</b>
<br>
Esta clase permite crear métodos para hacer trazas de la ejecución del parser.<br><br>
<i>Este archivo debe copiarse en el paquete Sintactico.</i>
<br><br><br>
<b>- SlkParser.java</b>
<br>
En esta clase se encuentra el método principal del analizador.<br><br>
<i>Este archivo debe copiarse en el paquete Sintactico.</i> Además, hay que realizar tres modificaciones. En el método
<i>parse</i> hay que añadir como último parámetro el scanner. Unas 15 líneas más abajo, la función <i>get</i> de la
clase SlkToken necesita una referencia al scanner como parámetro. Lo mismo ocurre más abajo, debajo del comentario
<i>"terminal symbol"</i>. 
<br><br><br>
<b>- SlkString.txt</b>
<br>
En esta clase se generan tres arrays de Strings. Uno para los símbolos terminales otro para los no terminales 
y un tercero para las reglas de producción.<br><br>
<i>Este archivo debe copiarse con la extensión .java en el paquete Sintactico.</i>
<br><br><br>
<b>- SlkToken.java</b>
<br>
Esta clase contiene formato de token con el trabaja el analizador sintáctico. Como los token que envía el analizador
léxico tienen un formato distinto, hemos diseñado un método que traduce de uno a otro. Dicho método está en la clase
Token.java del paquete Lexico y se llama toSlkToken(). y hablaremos más adelante de él.<br><br>
<i>Este archivo debe copiarse en el paquete Sintactico.</i> 
<br><br><br>
</div>
<div id="sidebar">
<div id="sidebarcontents"> 
<ul id="menu">
<li><h2>Sintáctico</h2></li>
<li>
   <ul>
    	<li><a href="#intro">Introducción</a></li>
    	<li><a href="#slk">Hablemos de SLK</a></li>
    	<li><a href="#func">Funcionamiento de SLK</a></li>
    	<li><a href="#func1">Qué ejecutamos</a></li>
    	<li><a href="#func2">Qué obtenemos</a></li>
   </ul>
</li>
<li><h2>Otros</h2></li>
<li>
	<ul>
		<li><a href="slkconstants.html">SLkConstants.java</a></li>
		<li><a href="gramatica.txt">Gramatica.txt</a></li>
	</ul>
</li>
</ul>

</div>
  <div id="sidebarbottom"></div>
</div>

<div class="clear"></div>
</div>
<div id="footer">
Compilador de Pascal:: PLg 2007-2008</div>
<div id="credit"><a href="http://www.ramblingsoul.com">CSS Layout</a> by Rambling Soul</div></div>

</body>
</html>
